package JavaEE.MySQL;

/* B+树:(MySQL知识点,组织数据的方式)
 * 时间复杂度O(logN)
 * 可以有效的控制树高,从而减少磁盘IO,提升效率
 * B+树的叶子节点可以按Key进行排序,保证了数据的有序性,从而可以支持范围查找
 *
 * B+树与B树的区别(高频面试题)
 * 1.叶子节点之间有一个相互连接的引用,可以通过一个叶子节点找到与它相邻的兄弟节点
 * (MySQL在组织叶子节点时使用的是"双向循环链表")
 * 2.非叶子节点中的值都包含在叶子节点中
 * (B+树的非叶子节点中只包含对子节点的引用,没有保存真正的数据,
 * 所有真实数据都保存在叶子节点中)
 * 3.对于B+树而言,在相同树高的情况下,查找任一元素的时候复杂度都一样,性能均衡
 *
 * MySQL为什么使用页?
 * 页是内存与磁盘交互的最小单元,默认大小为16KB,每次内存与磁盘的交互至少读取一页.
 * 所以在磁盘中每个页内部的地址都是连续的,之所以这样做,是因为在使用数据的过程中,根据
 * 局部性原理,(将来要使用的数据大概率与当前访问的数据在空间上是临近的)所以一次从磁盘
 * 中读取一页的数据放入内存中,当下次查询的数据还在这页时就可以直接从内存中读取,减少磁盘I/O,提高性能
 *
 * 页头和页尾
 * 上一页页号和下一页页号可以把页与页之间连接起来,形成一个双向链表.
 *
 * 页主体
 * 页主体部分用于保存真实数据,每当创建一个新页,都会自动分配两个行,
 * 一个是页内最小行Infimun(第一行,入口),一个是业内最大行Supremun(最后一行)
 * 这两行不存储真实信息,而是作为数据行链表的头和尾.
 * 第一个数据行有一个记录下一行的地址偏移量的区域next_record,将页内所有数据行组成了一个单向链表
 *
 * 页目录(槽)
 * 页中有很多个分组,当一个分组中的数据行大于8时,会自动拆分出另一个分组,同时在页目录中建一个槽
 * 槽和分组是一一对应的关系,槽里记录了当前分组最后一条记录的主键值.
 * (页内查询会判断槽中的值,找到数据可以存在的分组,再去分组中逐条比对,最终找到目标行)
 *
 * 索引分类:
 * 1.主键索引
 * 当在一个表上定义一个主键PRIMARY KEY时,会自动创建主键索引,InnoDB使用它作为"聚集索引"
 * 推荐为每个表定义一个主键,如果没有逻辑上唯一且非空的列,则添加一个自增列
 *
 * 2.普通索引
 * 基本的,可以为多列创建组合索引(复合/组合索引)
 * 如查字典:c -> ch -> cha
 *
 * 3.唯一索引
 * 一个表上定义一个唯一键UNQUE时,自动创建唯一索引.
 *
 * 4.全文索引
 * 基于文本列上创建,以加快对这些列中包含的数据查询和DML操作
 *
 * 5.聚集索引
 * 与主键索引是同义词
 *
 * 6.非聚集索引
 * 聚集索引以外的索引
 *
 * 7.索引覆盖
 * 查询的字段都包含在(聚簇索引的主键)中,或(查询的字段都包含在当前使用的索引中).
 * 比如:(主目录:书ID)(分类目录:题材)
 * 那么直接查ID或题材,则(只看目录就能得到答案),且(数据仅是当前使用的索引)(性能高)
 *
 * 8.回表查询
 * 查询非(主目录)或(分类目录)且(查询的字段不包含在当前使用的索引中)
 * 使得需要先通过(分类目录)信息,筛选到部分(主目录)信息,再从这些主目录信息中,找到目标的具体位置.
 * 比如:(主目录:书ID)(分类目录:作者目录)
 * 此时想查(金庸写的所有书),需要从作者目录中找到金庸
 * 然后通过"金庸"去(主目录)找到每本书的具体位置(性能低)
 */


public class Demo1 {
}
